#define _CRT_SECURE_NO_WARNINGS 1
#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <cassert>
#include <iostream>
using namespace std;



#define PRINTF(fmt, ...) printf("[%s:%d] "fmt, __FILE__, __LINE__, ##__VA_ARGS__)
//int main()
//{
//	int count = 3;
//	const char* s = "dream!";
//	PRINTF("lalala\n");
//	return 0;
//}


void PrintNum(const int count, ...)
{
	va_list ap;
	va_start(ap, count);
	for (int i = 0; i < count; ++i)
	{
		int num = va_arg(ap, int);
		printf("%d ", num);
	}
	printf("\n");
	va_end(ap);
}
//int main()
//{
//	PrintNum(5, 559, 22198, 24689, 135, 47);
//	return 0;
//}

void MyPrintf(const char* fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);

	size_t size = strlen(fmt);
	int i = 0;
	while (i < size)
	{
		if (*(fmt + i) == '%')
		{
			++i;
			if (*(fmt + i) == '%')
				putchar(*(fmt + i));
			else if (*(fmt + i) == 'd')
			{
				int num = va_arg(ap, int);
				printf("%d", num);
			}
			else if (*(fmt + i) == 's')
			{
				const char* s = va_arg(ap, const char*);
				printf("%s", s);
			}
			else
			{
				va_end(ap);
				assert(false);
			}
			++i;
		}
		else
			putchar(*(fmt + i++));
	}
	va_end(ap);
}

//int main()
//{
//	const char* s = "dreams";
//	for (int i = 0; i < 3; ++i)
//	{
//		MyPrintf("I have %d %s\n", i + 1, s);
//	}
//	return 0;
//}


void PrintNumCPP()
{
	cout << endl;
}
template<class T, class ...Arg>
void PrintNumCPP(const T& val, Arg&& ...args) 
{
	cout << val << " ";
	PrintNumCPP(forward<Arg>(args)...);
}
int main()
{
	PrintNumCPP(53, "sdfsj", 653, 153.435, 5534, 24332566);
	return 0;
}